# -*- coding: utf-8 -*-

from django import forms

class CustomTokenInputWidget(forms.TextInput):
    def render(self, name, value, attrs=None, choices=()):
        """ Gera uma input type=text pra ser usado pelo form
        e pelo tokeninput.js com um campo extra (data-tokeninput: contem os itens
        já selecionados recuperados do banco ou do form enviado pelo usuario)


        Obs. 'self.choices' é o iterator do queryset enviado pelo field.
        Devemos mostrar apenas os itens que estiverem selecionados.
        A lista de chaves selecionadas está no 'value'.
        CUIDADO: 'value' também pode ser uma string com dados inválidos.
        """
        selected_options = []
        if isinstance(value, (list, tuple)):
            #value veio do banco: é uma lista de chaves primarias
            selected_options = value
            value = u','.join(unicode(x) for x in value)
        else:
            if value:
                #value veio do form do usuario: é uma string
                selected_options = [ long(x) for x in value.split(',') ]

        import json
        from itertools import chain
        data = []
        for k, v in chain(self.choices, choices):
            # Verifica se o item está na lista dos selecionados.
            if k in selected_options:
                data.append({'id': k, 'name': v})

        #manda os dados selecionados para o tokeninput.js
        attrs.update({
            'data-tokeninput': json.dumps(data),
        })

        return super(CustomTokenInputWidget, self).render(name, value, attrs)


class CustomTokenInputField(forms.ModelMultipleChoiceField):
    #Field customizado pra ser usado pelo tokenInput (plugin .js)
    widget = CustomTokenInputWidget

    def clean(self, value):
        #value deveria ser uma lista de ints
        #então isso aqui transforma uma string separada por virgulas e a transforma
        #na lista esperada pelo ModelMultipleChoiceField
        if value and isinstance(value, (str, unicode)):
            value = [ x.strip() for x in value.split(',') ]
        return super(CustomTokenInputField, self).clean(value)



